

<!DOCTYPE html>
<html lang="zh-CN" data-default-color-scheme=auto>



<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/img/favicon.png">
  <link rel="icon" href="/img/favicon.png">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#2f4154">
  <meta name="description" content="Blue~u~u~u">
  <meta name="author" content="Blue~u~u~u">
  <meta name="keywords" content="">
  <meta name="description" content="Redis-day01第一章 非关系型数据库的简介第一节 技术发展线路 第二节 互联网发展所面临的问题1. Web1.0 时代 2. Web2.0时代 3. 互联网三高问题3.1 高并发、大流量大型网站系统需要面对高并发(QPS)用户，大流量访问。Google日均PV数35亿，日均IP访问数3亿；腾讯QQ的最大在线用户数1.4亿（2011年数据）；微信用户量已超11亿；2019年天猫双十一交易额突">
<meta property="og:type" content="article">
<meta property="og:title" content="redis-入门">
<meta property="og:url" content="http://www.slx.blue/2021/12/19/redis-01/index.html">
<meta property="og:site_name" content="Blue~u~u~u~u">
<meta property="og:description" content="Redis-day01第一章 非关系型数据库的简介第一节 技术发展线路 第二节 互联网发展所面临的问题1. Web1.0 时代 2. Web2.0时代 3. 互联网三高问题3.1 高并发、大流量大型网站系统需要面对高并发(QPS)用户，大流量访问。Google日均PV数35亿，日均IP访问数3亿；腾讯QQ的最大在线用户数1.4亿（2011年数据）；微信用户量已超11亿；2019年天猫双十一交易额突">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_001.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_002.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_003.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_004.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_005.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_006.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_007.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_008.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_009.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_009.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_010.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_011.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_012.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_013.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_014.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_015.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_016.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_021.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_017.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_018.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_019.png">
<meta property="og:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_020.png">
<meta property="article:published_time" content="2021-12-19T15:43:22.000Z">
<meta property="article:modified_time" content="2021-12-19T15:45:18.299Z">
<meta property="article:author" content="Blue~u~u~u">
<meta property="article:tag" content="redis">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="http://www.slx.blue/2021/12/19/redis-01/tu_001.png">
  
  <title>redis-入门 - Blue~u~u~u~u</title>

  <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4/dist/css/bootstrap.min.css" />


  <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/github-markdown-css@4/github-markdown.min.css" />
  <link  rel="stylesheet" href="/lib/hint/hint.min.css" />

  
    
    
      
      <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/highlight.js@10/styles/github-gist.min.css" />
    
  

  
    <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3/dist/jquery.fancybox.min.css" />
  


<!-- 主题依赖的图标库，不要自行修改 -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_ba1fz6golrf.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_kmeydafke9r.css">


<link  rel="stylesheet" href="/css/main.css" />

<!-- 自定义样式保持在最底部 -->


  <script id="fluid-configs">
    var Fluid = window.Fluid || {};
    var CONFIG = {"hostname":"www.slx.blue","root":"/","version":"1.8.12","typing":{"enable":true,"typeSpeed":180,"cursorChar":"_","loop":true},"anchorjs":{"enable":true,"element":"h1,h2,h3,h4,h5,h6","placement":"right","visible":"hover","icon":""},"progressbar":{"enable":true,"height_px":3,"color":"#29d","options":{"showSpinner":false,"trickleSpeed":100}},"copy_btn":true,"image_zoom":{"enable":true,"img_url_replace":["",""]},"toc":{"enable":true,"headingSelector":"h1,h2,h3,h4,h5,h6","collapseDepth":0},"lazyload":{"enable":true,"loading_img":"/img/loading.gif","onlypost":false,"offset_factor":2},"web_analytics":{"enable":false,"baidu":null,"google":null,"gtag":null,"tencent":{"sid":null,"cid":null},"woyaola":null,"cnzz":null,"leancloud":{"app_id":null,"app_key":null,"server_url":null,"path":"window.location.pathname"}},"search_path":"/local-search.xml"};
  </script>
  <script  src="/js/utils.js" ></script>
  <script  src="/js/color-schema.js" ></script>
<meta name="generator" content="Hexo 5.4.0"></head>

<script src="https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome/css/font-awesome.min.css"/>
<script src="/live2d-widget/autoload.js"></script>


<body>
  <header style="height: 70vh;">
    <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand" href="/">
      <strong>Blue~u~u</strong>
    </a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/">
                <i class="iconfont icon-home-fill"></i>
                首页
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/archives/">
                <i class="iconfont icon-archive-fill"></i>
                归档
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/categories/">
                <i class="iconfont icon-category-fill"></i>
                分类
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/tags/">
                <i class="iconfont icon-tags-fill"></i>
                标签
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/about/">
                <i class="iconfont icon-user-fill"></i>
                关于
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/links/">
                <i class="iconfont icon-link-fill"></i>
                友链
              </a>
            </li>
          
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" target="_self" href="javascript:;" data-toggle="modal" data-target="#modalSearch" aria-label="Search">
              &nbsp;<i class="iconfont icon-search"></i>&nbsp;
            </a>
          </li>
        
        
          <li class="nav-item" id="color-toggle-btn">
            <a class="nav-link" target="_self" href="javascript:;" aria-label="Color Toggle">&nbsp;<i
                class="iconfont icon-dark" id="color-toggle-icon"></i>&nbsp;</a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>

    <div class="banner" id="banner" parallax=true
         style="background: url('/images/default.png') no-repeat center center;
           background-size: cover;">
      <div class="full-bg-img">
        <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
          <div class="page-header text-center fade-in-up">
            <span class="h2" id="subtitle" title="redis-入门">
              
            </span>

            
              <div class="mt-3">
  
  
    <span class="post-meta">
      <i class="iconfont icon-date-fill" aria-hidden="true"></i>
      <time datetime="2021-12-19 23:43" pubdate>
        2021年12月19日 晚上
      </time>
    </span>
  
</div>

<div class="mt-1">
  
    <span class="post-meta mr-2">
      <i class="iconfont icon-chart"></i>
      9.3k 字
    </span>
  

  
    <span class="post-meta mr-2">
      <i class="iconfont icon-clock-fill"></i>
      
      
      29 分钟
    </span>
  

  
  
    
      <!-- 不蒜子统计文章PV -->
      <span id="busuanzi_container_page_pv" style="display: none">
        <i class="iconfont icon-eye" aria-hidden="true"></i>
        <span id="busuanzi_value_page_pv"></span> 次
      </span>
    
  
</div>

            
          </div>

          
        </div>
      </div>
    </div>
  </header>

  <main>
    
      

<div class="container-fluid nopadding-x">
  <div class="row nomargin-x">
    <div class="d-none d-lg-block col-lg-2"></div>
    <div class="col-lg-8 nopadding-x-md">
      <div class="container nopadding-x-md" id="board-ctn">
        <div class="py-5" id="board">
          <article class="post-content mx-auto">
            <!-- SEO header -->
            <h1 style="display: none">redis-入门</h1>
            
              <p class="note note-info">
                
                  本文最后更新于：5 个月前
                
              </p>
            
            <div class="markdown-body">
              <h1 id="Redis-day01"><a href="#Redis-day01" class="headerlink" title="Redis-day01"></a>Redis-day01</h1><h2 id="第一章-非关系型数据库的简介"><a href="#第一章-非关系型数据库的简介" class="headerlink" title="第一章 非关系型数据库的简介"></a>第一章 非关系型数据库的简介</h2><h3 id="第一节-技术发展线路"><a href="#第一节-技术发展线路" class="headerlink" title="第一节 技术发展线路"></a>第一节 技术发展线路</h3><p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_001.png" srcset="/img/loading.gif" lazyload></p>
<h3 id="第二节-互联网发展所面临的问题"><a href="#第二节-互联网发展所面临的问题" class="headerlink" title="第二节 互联网发展所面临的问题"></a>第二节 互联网发展所面临的问题</h3><h4 id="1-Web1-0-时代"><a href="#1-Web1-0-时代" class="headerlink" title="1. Web1.0 时代"></a>1. Web1.0 时代</h4><p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_002.png" srcset="/img/loading.gif" lazyload></p>
<h4 id="2-Web2-0时代"><a href="#2-Web2-0时代" class="headerlink" title="2. Web2.0时代"></a>2. Web2.0时代</h4><p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_003.png" srcset="/img/loading.gif" lazyload></p>
<h4 id="3-互联网三高问题"><a href="#3-互联网三高问题" class="headerlink" title="3. 互联网三高问题"></a>3. 互联网三高问题</h4><h5 id="3-1-高并发、大流量"><a href="#3-1-高并发、大流量" class="headerlink" title="3.1 高并发、大流量"></a>3.1 高并发、大流量</h5><p>大型网站系统需要面对高并发(QPS)用户，大流量访问。Google日均PV数35亿，日均IP访问数3亿；腾讯QQ的最大在线用户数1.4亿（2011年数据）；微信用户量已超11亿；2019年天猫双十一交易额突破2500亿。 </p>
<h5 id="3-2-高可用"><a href="#3-2-高可用" class="headerlink" title="3.2 高可用"></a>3.2 高可用</h5><p>系统7×24小时不间断服务。大型互联网站的宕机事件通常会成为新闻焦点，微博宕机、B站挂了、腾讯视频挂了，成为重大新闻热点。 </p>
<h5 id="3-3-海量数据"><a href="#3-3-海量数据" class="headerlink" title="3.3 海量数据"></a>3.3 海量数据</h5><p>需要存储、管理海量数据，需要使用大量服务器。Facebook每周上传的照片数目接近10亿，百度收录的网页数目有数百亿，Google有近百万台服务器为全球用户提供服务。 </p>
<h3 id="第三节-解决上述问题的思路"><a href="#第三节-解决上述问题的思路" class="headerlink" title="第三节 解决上述问题的思路"></a>第三节 解决上述问题的思路</h3><h4 id="1-解决CPU和内存压力问题"><a href="#1-解决CPU和内存压力问题" class="headerlink" title="1. 解决CPU和内存压力问题"></a>1. 解决CPU和内存压力问题</h4><p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_004.png" srcset="/img/loading.gif" lazyload></p>
<h4 id="2-解决IO压力问题"><a href="#2-解决IO压力问题" class="headerlink" title="2. 解决IO压力问题"></a>2. 解决IO压力问题</h4><p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_005.png" srcset="/img/loading.gif" lazyload></p>
<h3 id="第四节-非关系型数据库的概念"><a href="#第四节-非关系型数据库的概念" class="headerlink" title="第四节 非关系型数据库的概念"></a>第四节 非关系型数据库的概念</h3><p>NoSQL是Not only SQL的缩写，大意为“不只是SQL”，说明这项技术是<strong>传统关系型数据库的补充</strong>而非替代。在整个NoSQL技术栈中<strong>MemCache</strong>、<strong>Redis</strong>、<strong>MongoDB</strong>被称为NoSQL三剑客。那么时代为什么需要NoSQL数据库呢？</p>
<p>我们来做个对比：</p>
<h4 id="1-关系型数据库和非关系型数据库的对比"><a href="#1-关系型数据库和非关系型数据库的对比" class="headerlink" title="1. 关系型数据库和非关系型数据库的对比"></a>1. 关系型数据库和非关系型数据库的对比</h4><table>
<thead>
<tr>
<th>对比项</th>
<th>关系型数据库</th>
<th>非关系型数据库</th>
</tr>
</thead>
<tbody><tr>
<td>数据存储位置</td>
<td>硬盘</td>
<td>内存</td>
</tr>
<tr>
<td>数据结构</td>
<td>高度组织化结构化数据</td>
<td>没有预定义的模式</td>
</tr>
<tr>
<td>数据操作方式</td>
<td>SQL</td>
<td>所有数据都是键值对，没有声明性查询语言</td>
</tr>
<tr>
<td>事务控制</td>
<td>严格的基于事务ACID原则</td>
<td>基于乐观锁的松散事务控制</td>
</tr>
<tr>
<td>访问控制</td>
<td>细粒度的用户访问权限控制</td>
<td>简单的基于IP绑定或密码的访问控制</td>
</tr>
<tr>
<td>外键</td>
<td>支持</td>
<td>不支持</td>
</tr>
<tr>
<td>索引</td>
<td>支持</td>
<td>不支持</td>
</tr>
</tbody></table>
<p>所以NoSQL数据库的最大优势体现为：高性能、高可用性和可伸缩性。</p>
<h4 id="2-非关系型数据库的适用场景"><a href="#2-非关系型数据库的适用场景" class="headerlink" title="2. 非关系型数据库的适用场景"></a>2. 非关系型数据库的适用场景</h4><ul>
<li><p>对数据高并发的读写</p>
</li>
<li><p>海量数据的读写</p>
</li>
<li><p>对数据高可扩展性的</p>
</li>
</ul>
<h4 id="3-非关系型数据库不适用的常见"><a href="#3-非关系型数据库不适用的常见" class="headerlink" title="3. 非关系型数据库不适用的常见"></a>3. 非关系型数据库不适用的常见</h4><ul>
<li><p>需要事务支持</p>
</li>
<li><p>基于sql的结构化查询存储，处理复杂的关系,需要即席查询。</p>
</li>
</ul>
<h2 id="第二章-Redis的简介"><a href="#第二章-Redis的简介" class="headerlink" title="第二章 Redis的简介"></a>第二章 Redis的简介</h2><h3 id="第一节-Redis的官方介绍"><a href="#第一节-Redis的官方介绍" class="headerlink" title="第一节 Redis的官方介绍"></a>第一节 Redis的官方介绍</h3><p>中文官网介绍: Redis是一个开源（BSD许可）的，内存中的数据结构存储系统，它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构，如字符串（strings），散列（hashes），列表（lists），集合（sets），有序集合（sorted sets） 与范围查询，bitmaps，hyperloglogs和地理空间（geospatial） 索引半径查询。 Redis 内置了复制（replication），LUA脚本（Lua scripting）， LRU驱动事件（LRU eviction），事务（transactions）和不同级别的磁盘持久化（persistence）， 并通过Redis哨兵（Sentinel）和自动分区（Cluster）提供高可用性（high availability）。</p>
<p>下面是几点补充：</p>
<ul>
<li>Redis的名字是Remote Dictionary Server的缩写。</li>
<li>开发语言是ANSI C。</li>
<li>支持多种不同语言的客户端。</li>
<li>官方给出的性能参考（在并发量50的情况下）：<ul>
<li>GET: 110000/s:读的速度每秒11万次</li>
<li>SET: 81000/s: 写的速度每秒8万次</li>
</ul>
</li>
</ul>
<p>中文官网<a target="_blank" rel="noopener" href="http://www.redis.cn/">http://www.redis.cn</a><br>英文官网<a target="_blank" rel="noopener" href="http://redis.io/">http://redis.io</a></p>
<p>Redis命令参考文档网址：<a target="_blank" rel="noopener" href="http://redisdoc.com/">http://redisdoc.com</a></p>
<h3 id="第二节-Redis的应用场景"><a href="#第二节-Redis的应用场景" class="headerlink" title="第二节 Redis的应用场景"></a>第二节 Redis的应用场景</h3><h4 id="1-配合关系型数据库做高速缓存"><a href="#1-配合关系型数据库做高速缓存" class="headerlink" title="1. 配合关系型数据库做高速缓存"></a>1. 配合关系型数据库做高速缓存</h4><p>使用Redis可以建立性能非常出色的缓存服务器，查询请求先在Redis中查找所需要的数据，如果能够查询到（命中）则直接返回，大大减轻关系型数据库的压力。 例如: 高频次，热门访问，并且不会经常变化的数据，降低数据库IO</p>
<h4 id="2-数据临时存储位置"><a href="#2-数据临时存储位置" class="headerlink" title="2. 数据临时存储位置"></a>2. 数据临时存储位置</h4><p>使用token（令牌）作为用户登录系统时的身份标识，这个token就可以在Redis中临时存储。</p>
<h4 id="3-作为分布式环境下解决Session不一致问题时的Session库"><a href="#3-作为分布式环境下解决Session不一致问题时的Session库" class="headerlink" title="3. 作为分布式环境下解决Session不一致问题时的Session库"></a>3. 作为分布式环境下解决Session不一致问题时的Session库</h4><p>Spring提供了一种技术解决分布式环境下Session不一致问题，叫SpringSession。而Redis就可以为SpringSession提供一个数据存储空间。 </p>
<h4 id="4-多样的数据结构存储持久化数据"><a href="#4-多样的数据结构存储持久化数据" class="headerlink" title="4. 多样的数据结构存储持久化数据"></a>4. 多样的数据结构存储持久化数据</h4><p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_006.png" srcset="/img/loading.gif" lazyload></p>
<h2 id="第三章-安装Redis"><a href="#第三章-安装Redis" class="headerlink" title="第三章 安装Redis"></a>第三章 安装Redis</h2><h3 id="第一节-安装Linux版本的Redis"><a href="#第一节-安装Linux版本的Redis" class="headerlink" title="第一节 安装Linux版本的Redis"></a>第一节 安装Linux版本的Redis</h3><h4 id="1-具体安装步骤"><a href="#1-具体安装步骤" class="headerlink" title="1. 具体安装步骤"></a>1. 具体安装步骤</h4><h5 id="1-1-上传redis压缩包"><a href="#1-1-上传redis压缩包" class="headerlink" title="1.1 上传redis压缩包"></a>1.1 上传redis压缩包</h5><p>使用xftp将redis压缩包上传到虚拟机的<code>/usr/local</code>目录中</p>
<p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_007.png" srcset="/img/loading.gif" lazyload></p>
<p>上传完之后建议拍个快照，以防安装出错</p>
<h5 id="1-2-安装c语言编译环境"><a href="#1-2-安装c语言编译环境" class="headerlink" title="1.2 安装c语言编译环境"></a>1.2 安装c语言编译环境</h5><p>因为是Redis是c语言开发的，所以要运行redis必须有c语言编译环境</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs shell">yum install gcc-c++ -y<br><span class="hljs-meta">#</span><span class="bash"> 安装GCC环境，中间有确认的话，一律选y (yes)</span><br><span class="hljs-meta">#</span><span class="bash"> 注意：使用yum命令安装软件，需要联网</span><br></code></pre></td></tr></table></figure>

<h5 id="1-3-解压redis"><a href="#1-3-解压redis" class="headerlink" title="1.3 解压redis"></a>1.3 解压redis</h5><ol>
<li>进入<code>/usr/local</code>目录: <code>cd /usr/local</code></li>
<li>解压: <code>tar -xvf redis-5.0.13.tar.gz</code></li>
</ol>
<h5 id="1-4-重命名文件夹"><a href="#1-4-重命名文件夹" class="headerlink" title="1.4 重命名文件夹"></a>1.4 重命名文件夹</h5><p>将 <code>redis-5.0.13</code>重命名成<code>redis</code></p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">mv redis-5.0.13 redis<br></code></pre></td></tr></table></figure>

<h5 id="1-5-编译安装"><a href="#1-5-编译安装" class="headerlink" title="1.5 编译安装"></a>1.5 编译安装</h5><ol>
<li>进入redis目录:<code>cd redis/</code></li>
<li>编译redis:<code>make</code></li>
<li>指定安装路径并且安装: <code>make PREFIX=/usr/local/redis install</code>，安装好之后<code>/usr/local/redis</code>目录中会多出来一个<code>bin</code>目录</li>
</ol>
<h4 id="2-redis的配置和启动"><a href="#2-redis的配置和启动" class="headerlink" title="2. redis的配置和启动"></a>2. redis的配置和启动</h4><h5 id="2-1-修改配置文件"><a href="#2-1-修改配置文件" class="headerlink" title="2.1 修改配置文件"></a>2.1 修改配置文件</h5><ol>
<li><p>将<code>/usr/local/redis/redis.conf</code>配置文件拷贝到<code>/usr/local/redis/bin</code>目录中</p>
</li>
<li><p>使用<code>vim</code>编辑器修改<code>bin</code>目录中的<code>redis.conf</code>文件,修改如下三项</p>
<p><strong>注意：/var/logs目录需要我们提前创建好</strong></p>
<table>
<thead>
<tr>
<th>配置项名称</th>
<th>作用</th>
<th>取值</th>
</tr>
</thead>
<tbody><tr>
<td>daemonize</td>
<td>控制是否以守护进程形式运行Redis服务器</td>
<td>yes</td>
</tr>
<tr>
<td>logfile</td>
<td>指定日志文件位置</td>
<td>“/var/logs/redis.log”</td>
</tr>
<tr>
<td>dir</td>
<td>Redis工作目录</td>
<td>/usr/local/redis</td>
</tr>
</tbody></table>
</li>
</ol>
<h5 id="2-2-后台启动redis服务器"><a href="#2-2-后台启动redis服务器" class="headerlink" title="2.2 后台启动redis服务器"></a>2.2 后台启动redis服务器</h5><ol>
<li>进入redis的bin目录: <code>cd /usr/local/redis/bin</code></li>
<li>让redis根据配置文件启动: <code>./redis-server ./redis.conf</code></li>
</ol>
<h5 id="2-3-启动redis客户端连接服务器"><a href="#2-3-启动redis客户端连接服务器" class="headerlink" title="2.3 启动redis客户端连接服务器"></a>2.3 启动redis客户端连接服务器</h5><p><code>./redis-cli</code>,然后执行<code>ping</code>命令，如果能连接上，代表redis安装成功，并且redis服务器启动成功</p>
<h3 id="第二节-Windows版本Redis的安装-不建议使用"><a href="#第二节-Windows版本Redis的安装-不建议使用" class="headerlink" title="第二节 Windows版本Redis的安装(不建议使用)"></a>第二节 Windows版本Redis的安装(不建议使用)</h3><p>Redis官方没有开发支持Windows的版本， 但是，Microsoft开发技术小组开发和维护了Redis的Windows版本(只能使用在64位的电脑上)</p>
<h4 id="1-具体安装步骤-1"><a href="#1-具体安装步骤-1" class="headerlink" title="1. 具体安装步骤"></a>1. 具体安装步骤</h4><h5 id="1-1-软件所在位置"><a href="#1-1-软件所在位置" class="headerlink" title="1.1 软件所在位置"></a>1.1 软件所在位置</h5><p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_008.png" srcset="/img/loading.gif" lazyload></p>
<p>任选一个版本均可，建议选最高的</p>
<h5 id="1-2-开始安装"><a href="#1-2-开始安装" class="headerlink" title="1.2 开始安装"></a>1.2 开始安装</h5><ol>
<li><p>双击msi文件</p>
<p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_009.png" srcset="/img/loading.gif" lazyload></p>
</li>
<li><p>直接点击下一步</p>
<p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_009.png" srcset="/img/loading.gif" lazyload></p>
</li>
<li><p>同意协议</p>
<p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_010.png" srcset="/img/loading.gif" lazyload></p>
</li>
<li><p>设置安装路径</p>
<p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_011.png" srcset="/img/loading.gif" lazyload></p>
</li>
<li><p>端口号为<code>6379</code>不变</p>
</li>
</ol>
<p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_012.png" srcset="/img/loading.gif" lazyload></p>
<ol start="6">
<li>设置最大内存空间限制</li>
</ol>
<p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_013.png" srcset="/img/loading.gif" lazyload></p>
<ol start="7">
<li>开始安装</li>
</ol>
<p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_014.png" srcset="/img/loading.gif" lazyload></p>
<ol start="8">
<li><p>安装之后的目录结构</p>
<p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_015.png" srcset="/img/loading.gif" lazyload></p>
</li>
</ol>
<h4 id="2-启动Redis服务"><a href="#2-启动Redis服务" class="headerlink" title="2. 启动Redis服务"></a>2. 启动Redis服务</h4><p>redis安装之后是Windows中的服务,采用启动和关闭服务的方式对其进行启动和关闭即可</p>
<p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_016.png" srcset="/img/loading.gif" lazyload></p>
<h4 id="3-客户端连接Redis"><a href="#3-客户端连接Redis" class="headerlink" title="3. 客户端连接Redis"></a>3. 客户端连接Redis</h4><p>双击redis安装路径中的<code>redis-cli.exe</code>即可打开redis的客户端，然后连接到redis服务</p>
<h4 id="4-安装Redis可视化客户端"><a href="#4-安装Redis可视化客户端" class="headerlink" title="4. 安装Redis可视化客户端"></a>4. 安装Redis可视化客户端</h4><p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_021.png" srcset="/img/loading.gif" lazyload></p>
<p>但是Windows中的Redis可视化客户端默认无法与Linux中的Redis服务器连接，需要修改Linux中的Redis服务器的配置: 在redis.conf配置文件中在bind的值的后面加上虚拟机的IP地址(在后面将Jedis的时候会讲到)，并且要确保Linux的防火墙放行了”6379”端口，或者防火墙关闭了</p>
<figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs dns">例如:原本的是<br>bind <span class="hljs-number">127.0.0.1</span><br>现在改成<br>bind <span class="hljs-number">127.0.0.1</span> <span class="hljs-number">192.168.141.135</span><br></code></pre></td></tr></table></figure>

<p>改完之后要重启redis:</p>
<figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs applescript">先找到redis服务的进程<span class="hljs-built_in">id</span><br>ps -ef | grep redis<br>然后根据进程<span class="hljs-built_in">id</span>杀死进程<br>kill <span class="hljs-number">-9</span> 进程<span class="hljs-built_in">id</span><br></code></pre></td></tr></table></figure>



<h2 id="第三章-Redis常用数据结构"><a href="#第三章-Redis常用数据结构" class="headerlink" title="第三章 Redis常用数据结构"></a>第三章 Redis常用数据结构</h2><h3 id="第一节-Redis总体结构"><a href="#第一节-Redis总体结构" class="headerlink" title="第一节 Redis总体结构"></a>第一节 Redis总体结构</h3><p>Redis中的数据，总体上是键值对，不同数据类型指的是键值对中值的类型。其中value支持8种数据类型</p>
<table>
<thead>
<tr>
<th>数据类型</th>
<th>应用场景</th>
</tr>
</thead>
<tbody><tr>
<td>string</td>
<td>分布式Session存储 分布式数据库ID 计数器：统计网站访问量</td>
</tr>
<tr>
<td>hash</td>
<td>存储对象信息（购物车中的商品信息） 存储表的信息</td>
</tr>
<tr>
<td>list</td>
<td>实现队列、栈操作 汇总日志 粉丝列表 关注的人列表</td>
</tr>
<tr>
<td>set</td>
<td>签到 打卡 点赞</td>
</tr>
<tr>
<td>zset</td>
<td>排行榜 百度热点搜索</td>
</tr>
<tr>
<td>geospatial</td>
<td>获取地理位置信息 两地之间的距离</td>
</tr>
<tr>
<td>hyperloglogs</td>
<td>基数统计</td>
</tr>
<tr>
<td>bitmaps</td>
<td>统计用户访问次数</td>
</tr>
</tbody></table>
<h3 id="第二节-八种数据类型的简介"><a href="#第二节-八种数据类型的简介" class="headerlink" title="第二节 八种数据类型的简介"></a>第二节 八种数据类型的简介</h3><h4 id="1-string-类型"><a href="#1-string-类型" class="headerlink" title="1. string 类型"></a>1. string 类型</h4><p>Redis中最基本的类型，它是key对应的一个单一值。二进制安全，不必担心由于编码等问题导致二进制数据变化。所以redis的string可以包含任何数据，比如jpg图片或者序列化的对象。Redis中一个字符串值的最大容量是512M。</p>
<h4 id="2-list类型"><a href="#2-list类型" class="headerlink" title="2. list类型"></a>2. list类型</h4><p>Redis 列表是简单的字符串列表，按照插入顺序排序。你可以添加一个元素到列表的头部（左边）或者尾部（右边）。它的底层是双向链表，所以它操作时头尾效率高，中间效率低（额外花费查找插入位置的时间）。</p>
<p>在Redis中list类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样，我们可以在其头部(left)和尾部(right)添加新的元素。在插入时，如果该键并不存在，Redis将为该键创建一个新的链表。与此相反，如果链表中所有的元素均被移除，那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是2^32-1个。</p>
<p>list是一个有序可以重复的数据类型。</p>
<h4 id="3-set类型"><a href="#3-set类型" class="headerlink" title="3. set类型"></a>3. set类型</h4><p>Redis的set是string类型的无序集合。它是基于哈希表实现的。set类型插入数据时会自动去重。最大可以包含2^32-1个元素。</p>
<p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_017.png" srcset="/img/loading.gif" lazyload></p>
<h4 id="4-hash类型"><a href="#4-hash类型" class="headerlink" title="4. hash类型"></a>4. hash类型</h4><p>本身就是一个键值对集合。可以当做Java中的Map&lt;String,String&gt;对待。每一个hash可以存储2^32-1个键值对。 </p>
<p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_018.png" srcset="/img/loading.gif" lazyload></p>
<h4 id="5-zset类型"><a href="#5-zset类型" class="headerlink" title="5. zset类型"></a>5. zset类型</h4><p>Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。 </p>
<p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_019.png" srcset="/img/loading.gif" lazyload></p>
<h4 id="6-Geospatial"><a href="#6-Geospatial" class="headerlink" title="6. Geospatial"></a>6. Geospatial</h4><p>Redis 在 3.2 推出 Geo 类型，该功能可以推算出地理位置信息，两地之间的距离。 </p>
<p><img src="http://www.slx.blue/2021/12/19/redis-01/tu_020.png" srcset="/img/loading.gif" lazyload></p>
<h4 id="7-HyperLogLogs"><a href="#7-HyperLogLogs" class="headerlink" title="7. HyperLogLogs"></a>7. HyperLogLogs</h4><p>用于大数据量基数统计，速度非常快，占用内存非常小。每个HyperLogLog键只需要花费12KB内存，就可以计算接近 2^64个不同元素的基数。比如计算网站UV（User view，用户访问数量，一个用户一天访问同一个URL地址多次合并为一次）。 </p>
<h4 id="8-bitmap"><a href="#8-bitmap" class="headerlink" title="8. bitmap"></a>8. bitmap</h4><p>直接对string的二进制位进行操作的一组命令 </p>
<h2 id="第三章-Redis命令行操作"><a href="#第三章-Redis命令行操作" class="headerlink" title="第三章 Redis命令行操作"></a>第三章 Redis命令行操作</h2><h3 id="第一节-基本操作命令"><a href="#第一节-基本操作命令" class="headerlink" title="第一节 基本操作命令"></a>第一节 基本操作命令</h3><h4 id="1-切换数据库"><a href="#1-切换数据库" class="headerlink" title="1. 切换数据库"></a>1. 切换数据库</h4><p>Redis默认有16个数据库,默认情况下使用的是第一个数据库，我们使用select进行切换，数据库索引从0开始</p>
<h4 id="2-查看数据库长度"><a href="#2-查看数据库长度" class="headerlink" title="2. 查看数据库长度"></a>2. 查看数据库长度</h4><p>数据库长度就是这个数据库中存储了多少条数据，使用<code>dbsize</code>可以查看数据库长度</p>
<h4 id="3-清空数据库"><a href="#3-清空数据库" class="headerlink" title="3. 清空数据库"></a>3. 清空数据库</h4><h5 id="3-1-清空当前数据库"><a href="#3-1-清空当前数据库" class="headerlink" title="3.1 清空当前数据库"></a>3.1 清空当前数据库</h5><p><code>flushdb</code></p>
<h5 id="3-2-清空所有数据库"><a href="#3-2-清空所有数据库" class="headerlink" title="3.2 清空所有数据库"></a>3.2 清空所有数据库</h5><p><code>flushall</code></p>
<h3 id="第二节-KEY操作"><a href="#第二节-KEY操作" class="headerlink" title="第二节 KEY操作"></a>第二节 KEY操作</h3><h4 id="1-KEY的命名规范"><a href="#1-KEY的命名规范" class="headerlink" title="1. KEY的命名规范"></a>1. KEY的命名规范</h4><p>在实际操作中对于Key的定义大家注意下面几点：</p>
<ul>
<li>Key不要太长，超过1024字节将消耗过多内存，降低查询效率。尽管Redis支持的Key最大长度为512MB。</li>
<li>Key仍然要做到见名知意。</li>
<li>在同一个项目中遵循同一个命名规范，习惯上多个单词用“:”分开。例如：“user:token:session:id”</li>
<li>Redis命令不区分大小写，Key区分大小写</li>
</ul>
<h4 id="2-KEY操作相关命令-等后续再来演示"><a href="#2-KEY操作相关命令-等后续再来演示" class="headerlink" title="2. KEY操作相关命令(等后续再来演示)"></a>2. KEY操作相关命令(等后续再来演示)</h4><table>
<thead>
<tr>
<th>命令</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>KEYS PATTERN</td>
<td>把匹配PATTERN的key返回。PATTERN中可以使用“*”匹配多个字符，使用“?”匹配单个字符</td>
</tr>
<tr>
<td>TYPE KEY</td>
<td>返回KEY对应的值的类型</td>
</tr>
<tr>
<td>MOVE KEY DB</td>
<td>把一组键值对数据移动到另一个数据库中</td>
</tr>
<tr>
<td>DEL KEY [KEY …] 重点</td>
<td>根据KEY进行删除，至少要指定一个KEY</td>
</tr>
<tr>
<td>EXISTS KEY [KEY …]</td>
<td>检查指定的KEY是否存在。指定一个KEY时，存在返回1，不存在返回0。可以指定多个，返回存在的KEY的数量。</td>
</tr>
<tr>
<td>RENAME KEY NEWKEY</td>
<td>重命名一个KEY，NEWKEY不管是否是已经存在的都会执行，如果NEWKEY已经存在则会被覆盖。</td>
</tr>
<tr>
<td>RENAMENX KEY NEWKEY</td>
<td>只有在NEWKEY不存在时能够执行成功，否则失败</td>
</tr>
<tr>
<td>TTL KEY</td>
<td>以秒为单位查看KEY还能存在多长时间<br>    正数：剩余的存活时间（单位：秒）<br>    -1：永不过期<br>    -2：不存在的Key</td>
</tr>
<tr>
<td>EXPIRE KEY SECONDS 重点</td>
<td>给一个KEY设置在SECONDS秒后过期，过期会被Redis移除。</td>
</tr>
<tr>
<td>PERSIST KEY</td>
<td>移除过期时间，变成永久key</td>
</tr>
</tbody></table>
<h3 id="第三节-string操作"><a href="#第三节-string操作" class="headerlink" title="第三节 string操作"></a>第三节 string操作</h3><table>
<thead>
<tr>
<th>命令</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody><tr>
<td>SET key value(重点)</td>
<td align="left">设置指定 key 的值</td>
</tr>
<tr>
<td>GET key(重点)</td>
<td align="left">获取指定 key 的值</td>
</tr>
<tr>
<td>APPEND KEY VALUE</td>
<td align="left">把指定的value追加到KEY对应的原来的值后面，返回值是追加后字符串长度</td>
</tr>
<tr>
<td>GETSET key value</td>
<td align="left">将给定 key 的值设为 value ，并返回 key 的旧值(old value)。</td>
</tr>
<tr>
<td>GETRANGE KEY START END</td>
<td align="left">从字符串中取指定的一段，索引从0开始     START是开始取值的索引     END是结束取值的索引</td>
</tr>
<tr>
<td>SETRANGE KEY OFFSET VALUE</td>
<td align="left">跳过offset个字符，然后使用Value替换等长度的内容</td>
</tr>
<tr>
<td>STRLEN KEY</td>
<td align="left">直接返回字符串长度</td>
</tr>
<tr>
<td>SETEX key seconds value(重点)</td>
<td align="left">将值 value 关联到 key ，并将 key 的过期时间设为 seconds (以秒为单位)。</td>
</tr>
<tr>
<td>SETNX key value</td>
<td align="left">只有在 key 不存在时设置 key 的值。</td>
</tr>
<tr>
<td>INCR key(重点)</td>
<td align="left">将 key 中储存的数字值增一。</td>
</tr>
<tr>
<td>INCRBY key increment</td>
<td align="left">将 key 所储存的值加上给定的增量值（increment） 。</td>
</tr>
<tr>
<td>DECR key</td>
<td align="left">将 key 中储存的数字值减一。</td>
</tr>
<tr>
<td>DECRBY key decrement</td>
<td align="left">key 所储存的值减去给定的减量值（decrement） 。</td>
</tr>
<tr>
<td>MSET KEY VALUE [KEY VALUE …]</td>
<td align="left">一次性设置一组多个键值对</td>
</tr>
<tr>
<td>MGET KEY [KEY …]</td>
<td align="left">一次性指定多个KEY，返回它们对应的值，没有值的KEY返回值是(nil</td>
</tr>
<tr>
<td>MSETNX KEY VALUE [KEY VALUE …</td>
<td align="left">一次性新建多个值</td>
</tr>
</tbody></table>
<h3 id="第四节-list操作"><a href="#第四节-list操作" class="headerlink" title="第四节 list操作"></a>第四节 list操作</h3><table>
<thead>
<tr>
<th>命令</th>
<th>命令描述</th>
</tr>
</thead>
<tbody><tr>
<td>LPUSH key value [value …] 重点</td>
<td>将一个或多个值插入到列表头部(左边)</td>
</tr>
<tr>
<td>LPUSHX key value</td>
<td>只能针对存在的list执行LPUSH</td>
</tr>
<tr>
<td>RPUSH key value [value …] 重点</td>
<td>在列表中添加一个或多个值(右边)</td>
</tr>
<tr>
<td>LRANGE key start stop</td>
<td>根据list集合的索引打印元素数据     正着数：0,1,2,3,…     倒着数：-1,-2,-3,…</td>
</tr>
<tr>
<td>LPOP key 重点</td>
<td>左边弹出一个 相当于移除第一个</td>
</tr>
<tr>
<td>RPOP key 重点</td>
<td>右边弹出一个  相当于移除最后一个</td>
</tr>
<tr>
<td>LLEN key</td>
<td>返回指定key所对应的list中元素个数</td>
</tr>
<tr>
<td>LINDEX key index</td>
<td>通过索引获取列表中的元素</td>
</tr>
<tr>
<td>LINSERT key BEFORE| AFTER pivot value</td>
<td>在pivot指定的值前面或后面插入value     如果pivot值有重复的，那么就从左往右数，以第一个遇到的pivot为基准     BEFORE表示放在pivot前面     AFTER表示放在pivot后面</td>
</tr>
<tr>
<td>RPOPLPUSH source destination</td>
<td>从source中RPOP一个元素，LPUSH到destination中</td>
</tr>
<tr>
<td>LREM key count value</td>
<td>根据count指定的数量从key对应的list中删除value     具体执行时从左往右删除，遇到一个删一个，删完为止</td>
</tr>
<tr>
<td>LSET key index value</td>
<td>把指定索引位置的元素替换为另一个值</td>
</tr>
<tr>
<td>LTRIM key start stop</td>
<td>仅保留指定区间的数据，两边的数据被删除</td>
</tr>
</tbody></table>
<h3 id="第五节-Set操作"><a href="#第五节-Set操作" class="headerlink" title="第五节 Set操作"></a>第五节 Set操作</h3><table>
<thead>
<tr>
<th>命令</th>
<th>命令描述</th>
</tr>
</thead>
<tbody><tr>
<td>SADD key member [member …]</td>
<td>给key指定的set集合中存入数据，set会自动去重</td>
</tr>
<tr>
<td>SREM key member [member …]</td>
<td>从集合中删除元素</td>
</tr>
<tr>
<td>SMEMBERS key</td>
<td>返回可以指定的set集合中所有的元素</td>
</tr>
<tr>
<td>SCARD key</td>
<td>返回集合中元素的数量</td>
</tr>
<tr>
<td>SISMEMBER key member</td>
<td>检查当前指定member是否是集合中的元素     返回1：表示是集合中的元素     返回0：表示不是集合中的元素</td>
</tr>
<tr>
<td>SPOP key</td>
<td>移除并返回集合中的一个随机元素</td>
</tr>
<tr>
<td>SDIFF key [key …]</td>
<td>将指定的集合执行“差集”操作     集合A：a,b,c     集合B：b,c,d     A对B执行diff：a     相当于：A-交集部分</td>
</tr>
<tr>
<td>SDIFFSTORE destination key [key …]</td>
<td>取差集后存入destination这个集合</td>
</tr>
<tr>
<td>SUNION key [key …]</td>
<td>将指定的集合执行“并集”操作     集合A：a,b,c     集合B：b,c,d     并集：a,b,c,d</td>
</tr>
<tr>
<td>SUNIONSTORE destination key [key …]</td>
<td>取并集后存入destination这个集合</td>
</tr>
<tr>
<td>SINTER key [key …]</td>
<td>将指定的集合进行“交集”操作     集合A：a,b,c     集合B：b,c,d     交集：b,c</td>
</tr>
<tr>
<td>SINTERSTORE destination key [key …]</td>
<td>取交集后存入destination这个集合</td>
</tr>
<tr>
<td>SMOVE source destination member</td>
<td>把member从source移动到destination</td>
</tr>
</tbody></table>
<h3 id="第六节-Hash操作"><a href="#第六节-Hash操作" class="headerlink" title="第六节 Hash操作"></a>第六节 Hash操作</h3><table>
<thead>
<tr>
<th align="left">命令</th>
<th>命令描述</th>
</tr>
</thead>
<tbody><tr>
<td align="left">HSET key field value</td>
<td>将哈希表 key 中的字段 field 的值设为 value</td>
</tr>
<tr>
<td align="left">HMSET key field value [field value …]</td>
<td>同时将多个 field-value (字段-值)对设置到哈希表 key 中</td>
</tr>
<tr>
<td align="left">HGET key field</td>
<td>获取存储在哈希表中指定字段的值</td>
</tr>
<tr>
<td align="left">HMGET key field [field …]</td>
<td>获取多个给定字段的值</td>
</tr>
<tr>
<td align="left">HDEL key field [field …]</td>
<td>删除一个或多个哈希表字段</td>
</tr>
<tr>
<td align="left">HLEN key</td>
<td>获取哈希表中字段的数量</td>
</tr>
<tr>
<td align="left">HGETALL key</td>
<td>获取在哈希表中指定 key 的所有字段和值</td>
</tr>
<tr>
<td align="left">HKEYS key</td>
<td>获取所有哈希表中的字段</td>
</tr>
<tr>
<td align="left">HVALS key</td>
<td>获取哈希表中所有值</td>
</tr>
<tr>
<td align="left">HEXISTS key field</td>
<td>判断是否存在某个字段</td>
</tr>
</tbody></table>
<h3 id="第七节-zset操作"><a href="#第七节-zset操作" class="headerlink" title="第七节 zset操作"></a>第七节 zset操作</h3><table>
<thead>
<tr>
<th>命令</th>
<th>命令描述</th>
</tr>
</thead>
<tbody><tr>
<td>ZADD key score member [score member …]</td>
<td>增加元素</td>
</tr>
<tr>
<td>ZSCORE key member</td>
<td>获取元素的分数</td>
</tr>
<tr>
<td>ZREM key member [member …]</td>
<td>删除元素</td>
</tr>
<tr>
<td>ZCARD key</td>
<td>获得集合中元素的数量</td>
</tr>
<tr>
<td>ZRANGE key start stop[WITHSCORES]</td>
<td>获得排名在某个范围的元素列表</td>
</tr>
<tr>
<td>ZREVRANGE key start stop</td>
<td>按照分数从高到低排序</td>
</tr>
<tr>
<td>ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]</td>
<td>在分数的指定区间内返回数据     min参数可以通过 -inf 表示负无穷     max参数可以通过 +inf 表示正无穷</td>
</tr>
<tr>
<td>ZRANK key member</td>
<td>先对分数进行升序排序，返回member的排名。排名从0开始</td>
</tr>
</tbody></table>
<h3 id="第八节-Geospatial-了解"><a href="#第八节-Geospatial-了解" class="headerlink" title="第八节 Geospatial(了解)"></a>第八节 Geospatial(了解)</h3><p>查询经纬度数据的网址：<a target="_blank" rel="noopener" href="http://www.jsons.cn/lngcode">http://www.jsons.cn/lngcode</a> </p>
<h4 id="1-添加地理位置"><a href="#1-添加地理位置" class="headerlink" title="1. 添加地理位置"></a>1. 添加地理位置</h4><figure class="highlight maxima"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs maxima">GEOADD <span class="hljs-built_in">key</span> longitude latitude <span class="hljs-built_in">member</span> [longitude latitude <span class="hljs-built_in">member</span> ...]<br></code></pre></td></tr></table></figure>

<p>规则：</p>
<p>1.取值范围</p>
<p> 有效的经度从 -180 度到 180 度。</p>
<p> 有效的纬度从 -85.05112878 度到 85.05112878 度。</p>
<p> 当坐标位置超出指定范围时，该命令将会返回一个错误。</p>
<p>2.已经添加的数据，是无法再次往里面添加的。</p>
<p>例子:</p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">GEOADD</span> china:city <span class="hljs-number">114</span>.<span class="hljs-number">085947</span> <span class="hljs-number">22</span>.<span class="hljs-number">547</span> shenzhen <br><span class="hljs-attribute">GEOADD</span> china:city <span class="hljs-number">113</span>.<span class="hljs-number">280637</span> <span class="hljs-number">23</span>.<span class="hljs-number">125178</span> guangzhou<br></code></pre></td></tr></table></figure>

<h4 id="2-查询已添加的地理位置"><a href="#2-查询已添加的地理位置" class="headerlink" title="2. 查询已添加的地理位置"></a>2. 查询已添加的地理位置</h4><p>Geo类型在Redis内部其实是使用zset类型存储的，所以可以使用zset的命令进行常规操作 </p>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">ZRANGE</span> china:city <span class="hljs-number">0</span> -<span class="hljs-number">1</span> <br><span class="hljs-attribute">ZRANGE</span> china:city <span class="hljs-number">0</span> -<span class="hljs-number">1</span> WITHSCORES<br></code></pre></td></tr></table></figure>

<h4 id="3-删除已添加的地理位置"><a href="#3-删除已添加的地理位置" class="headerlink" title="3. 删除已添加的地理位置"></a>3. 删除已添加的地理位置</h4><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">ZREM</span> china:city guangzhou<br></code></pre></td></tr></table></figure>

<h4 id="4-获取指定地区的坐标值"><a href="#4-获取指定地区的坐标值" class="headerlink" title="4. 获取指定地区的坐标值"></a>4. 获取指定地区的坐标值</h4><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">GEOPOS</span> china:city shenzhen<br></code></pre></td></tr></table></figure>

<h5 id="5-计算两地之间的直线距离"><a href="#5-计算两地之间的直线距离" class="headerlink" title="5. 计算两地之间的直线距离"></a>5. 计算两地之间的直线距离</h5><figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm">GEODIST china:city guangzhou <span class="hljs-keyword">shenzhen </span>km<br></code></pre></td></tr></table></figure>

<p>单位：</p>
<p>m 表示单位为米[默认值]。</p>
<p>km 表示单位为千米。</p>
<p>mi 表示单位为英里。</p>
<p>ft 表示单位为英尺。</p>
<p>如果用户没有显式地指定单位参数， 那么 GEODIST 默认使用米作为单位。</p>
<h4 id="6-以给定坐标为中心，在指定半径内查找元素"><a href="#6-以给定坐标为中心，在指定半径内查找元素" class="headerlink" title="6. 以给定坐标为中心，在指定半径内查找元素"></a>6. 以给定坐标为中心，在指定半径内查找元素</h4><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">GEORADIUS</span> china:city <span class="hljs-number">110</span> <span class="hljs-number">20</span> <span class="hljs-number">1000</span> km WITHCOORD WITHDIST<br></code></pre></td></tr></table></figure>

<p>WITHCOORD表示显示经纬度</p>
<p>WITHDIST表示显示到中心的距离</p>
<h4 id="7-在指定元素周围查找其他元素"><a href="#7-在指定元素周围查找其他元素" class="headerlink" title="7. 在指定元素周围查找其他元素"></a>7. 在指定元素周围查找其他元素</h4><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">GEORADIUSBYMEMBER</span> china:city shenzhen <span class="hljs-number">300</span> km WITHCOORD WITHDIST<br></code></pre></td></tr></table></figure>

<h3 id="第九节-HyperLogLogs-了解"><a href="#第九节-HyperLogLogs-了解" class="headerlink" title="第九节 HyperLogLogs(了解)"></a>第九节 HyperLogLogs(了解)</h3><h4 id="1-基数概念"><a href="#1-基数概念" class="headerlink" title="1. 基数概念"></a>1. 基数概念</h4><p>一个集合中不重复元素的个数。例如：集合{1,2,5,1,7,2,5}中元素个数是7，但是基数是4。而hyperloglogs的主要功能就是进行基数统计。 </p>
<h4 id="2-常用命令"><a href="#2-常用命令" class="headerlink" title="2. 常用命令"></a>2. 常用命令</h4><h5 id="2-1-添加"><a href="#2-1-添加" class="headerlink" title="2.1 添加"></a>2.1 添加</h5><figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm">PFADD user:access:<span class="hljs-number">1</span> tom <span class="hljs-keyword">jerry </span><span class="hljs-keyword">andy </span><span class="hljs-keyword">jim </span><span class="hljs-keyword">andy </span><span class="hljs-keyword">jerry </span>tom<br>PFADD user:access:<span class="hljs-number">2</span> <span class="hljs-keyword">andy </span><span class="hljs-keyword">jerry </span>tom <span class="hljs-keyword">bob </span>kate<br>PFADD user:access:<span class="hljs-number">3</span> mary harry tom <span class="hljs-keyword">jerry</span><br></code></pre></td></tr></table></figure>

<h5 id="2-2-统计"><a href="#2-2-统计" class="headerlink" title="2.2 统计"></a>2.2 统计</h5><figure class="highlight pgsql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs pgsql">PFCOUNT <span class="hljs-keyword">user</span>:<span class="hljs-keyword">access</span>:<span class="hljs-number">1</span> <span class="hljs-keyword">user</span>:<span class="hljs-keyword">access</span>:<span class="hljs-number">2</span> <span class="hljs-keyword">user</span>:<span class="hljs-keyword">access</span>:<span class="hljs-number">3</span><br></code></pre></td></tr></table></figure>

<h5 id="2-3-合并"><a href="#2-3-合并" class="headerlink" title="2.3 合并"></a>2.3 合并</h5><figure class="highlight pgsql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs pgsql">PFMERGE <span class="hljs-keyword">user</span>:<span class="hljs-keyword">access</span>:merge <span class="hljs-keyword">user</span>:<span class="hljs-keyword">access</span>:<span class="hljs-number">1</span> <span class="hljs-keyword">user</span>:<span class="hljs-keyword">access</span>:<span class="hljs-number">2</span> <span class="hljs-keyword">user</span>:<span class="hljs-keyword">access</span>:<span class="hljs-number">3</span><br></code></pre></td></tr></table></figure>

<h3 id="第十节-bitmap位图-了解"><a href="#第十节-bitmap位图-了解" class="headerlink" title="第十节 bitmap位图(了解)"></a>第十节 bitmap位图(了解)</h3><p>直接对数据的二进制位进行操作 ：</p>
<p>setbit设置指定比特位<br>getbit获取指定比特位<br>bitcount统计所有比特位中1的数量</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs text">set a hello<br>GETBIT a 0<br>GETBIT a 1<br>GETBIT a 2<br>GETBIT a 3<br>GETBIT a 4<br>GETBIT a 5<br>SETBIT a 5 1<br>get a<br>BITCOUNT a<br></code></pre></td></tr></table></figure>

<h2 id="第四章-总结"><a href="#第四章-总结" class="headerlink" title="第四章 总结"></a>第四章 总结</h2><ol>
<li>为什么需要NoSQL<ol>
<li>主要目的：解决互联网项目的性能问题</li>
<li>具体解决哪些性能问题: 高并发、海量数据、高可用</li>
</ol>
</li>
<li>Redis有几种数据类型<ol>
<li>string</li>
<li>list</li>
<li>set</li>
<li>hash</li>
<li>zset</li>
<li>地理位置</li>
<li>基数</li>
<li>bitmap</li>
</ol>
</li>
<li>redis存储数据的整体结构: 键值对</li>
<li>安装redis:<ol>
<li>安装完之后:修改配置文件</li>
<li>远程访问: 修改配置文件的bind</li>
<li>启动redis的时候: 一定要附加配置文件参数   <code>./redis-server 配置文件路径</code></li>
</ol>
</li>
</ol>

            </div>
            <hr>
            <div>
              <div class="post-metas mb-3">
                
                  <div class="post-meta mr-3">
                    <i class="iconfont icon-category"></i>
                    
                      <a class="hover-with-bg" href="/categories/redis/">redis</a>
                    
                  </div>
                
                
                  <div class="post-meta">
                    <i class="iconfont icon-tags"></i>
                    
                      <a class="hover-with-bg" href="/tags/redis/">redis</a>
                    
                  </div>
                
              </div>
              
                <p class="note note-warning">
                  
                    本博客目前大部分文章都是参考尚硅谷或者马士兵教育的学习资料！<a href="http://www.atguigu.com/" rel="nofollow noopener"官网地址！</a> 
                  
                </p>
              
              
                <div class="post-prevnext">
                  <article class="post-prev col-6">
                    
                    
                      <a href="/2021/12/19/redis-02/">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">redis-进阶</span>
                        <span class="visible-mobile">上一篇</span>
                      </a>
                    
                  </article>
                  <article class="post-next col-6">
                    
                    
                      <a href="/2021/12/16/Linux-02/">
                        <span class="hidden-mobile">Linux-进阶</span>
                        <span class="visible-mobile">下一篇</span>
                        <i class="iconfont icon-arrowright"></i>
                      </a>
                    
                  </article>
                </div>
              
            </div>

            
              <!-- Comments -->
              <article class="comments" id="comments" lazyload>
                
                  
                
                

              </article>
            
          </article>
        </div>
      </div>
    </div>
    
      <div class="d-none d-lg-block col-lg-2 toc-container" id="toc-ctn">
        <div id="toc">
  <p class="toc-header"><i class="iconfont icon-list"></i>&nbsp;目录</p>
  <div class="toc-body" id="toc-body"></div>
</div>

      </div>
    
  </div>
</div>

<!-- Custom -->


    

    
      <a id="scroll-top-button" aria-label="TOP" href="#" role="button">
        <i class="iconfont icon-arrowup" aria-hidden="true"></i>
      </a>
    

    
      <div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
     aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">搜索</h4>
        <button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input type="text" id="local-search-input" class="form-control validate">
          <label data-error="x" data-success="v"
                 for="local-search-input">关键词</label>
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>
    

    
  </main>

  <footer class="text-center mt-5 py-3">

  <div class="footer-content">
     <a href="https://hexo.io" target="_blank" rel="nofollow noopener"><span>Hexo</span></a> <i class="iconfont icon-love"></i> <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener"><span>Fluid</span></a> 
	<!--《添加网站运行时间 -->
<br/>

<span id="timeDate">载入天数...</span><span id="times">载入时分秒...</span>
<script>
var now = new Date(); 

function createtime() {
    //此处修改你的建站时间或者网站上线时间
    var grt = new Date('11/02/2021 21:39:00');
    now.setTime(now.getTime() + 250);
    days = (now - grt) / 1000 / 60 / 60 / 24;

    dnum = Math.floor(days);
    hours = (now - grt) / 1000 / 60 / 60 - (24 * dnum);
    hnum = Math.floor(hours);
    if (String(hnum).length == 1) {
        hnum = "0" + hnum;
    }
    minutes = (now - grt) / 1000 / 60 - (24 * 60 * dnum) - (60 * hnum);
    mnum = Math.floor(minutes);
    if (String(mnum).length == 1) {
        mnum = "0" + mnum;
    }
    seconds = (now - grt) / 1000 - (24 * 60 * 60 * dnum) - (60 * 60 * hnum) - (60 * mnum);
    snum = Math.round(seconds);
    if (String(snum).length == 1) {
        snum = "0" + snum;
    }
    document.getElementById("timeDate").innerHTML = " 本站已各种夹缝中安全运行 " + dnum + " 天 ";
    document.getElementById("times").innerHTML = hnum + " 小时 " + mnum + " 分 " + snum + " 秒";
}
setInterval("createtime()", 250);
</script>

<!-- 添加网站运行时间》-->
  </div>
  
  <div class="statistics">
    
    

    
      
        <!-- 不蒜子统计PV -->
        <span id="busuanzi_container_site_pv" style="display: none">
            总访问量 
            <span id="busuanzi_value_site_pv"></span>
             次
          </span>
      
      
        <!-- 不蒜子统计UV -->
        <span id="busuanzi_container_site_uv" style="display: none">
            总访客数 
            <span id="busuanzi_value_site_uv"></span>
             人
          </span>
      
    
  </div>


  

  
</footer>


  <!-- SCRIPTS -->
  
  <script  src="https://cdn.jsdelivr.net/npm/nprogress@0/nprogress.min.js" ></script>
  <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/nprogress@0/nprogress.min.css" />

  <script>
    NProgress.configure({"showSpinner":false,"trickleSpeed":100})
    NProgress.start()
    window.addEventListener('load', function() {
      NProgress.done();
    })
  </script>


<script  src="https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js" ></script>
<script  src="https://cdn.jsdelivr.net/npm/bootstrap@4/dist/js/bootstrap.min.js" ></script>
<script  src="/js/events.js" ></script>
<script  src="/js/plugins.js" ></script>

<!-- Plugins -->


  <script  src="/js/local-search.js" ></script>



  
    <script  src="/js/img-lazyload.js" ></script>
  



  



  
    <script  src="https://cdn.jsdelivr.net/npm/tocbot@4/dist/tocbot.min.js" ></script>
  
  
    <script  src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3/dist/jquery.fancybox.min.js" ></script>
  
  
    <script  src="https://cdn.jsdelivr.net/npm/anchor-js@4/anchor.min.js" ></script>
  
  
    <script defer src="https://cdn.jsdelivr.net/npm/clipboard@2/dist/clipboard.min.js" ></script>
  



  <script defer src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" ></script>




  <script  src="https://cdn.jsdelivr.net/npm/typed.js@2/lib/typed.min.js" ></script>
  <script>
    (function (window, document) {
      var typing = Fluid.plugins.typing;
      var title = document.getElementById('subtitle').title;
      
      typing(title)
      
    })(window, document);
  </script>















<!-- 主题的启动项 保持在最底部 -->
<script  src="/js/boot.js" ></script>


</body>
</html>
